package com.dlc.shop.seckill.common.service;

import com.dlc.shop.bean.app.dto.ShopCartOrderMergerDto;
import com.dlc.shop.common.bo.MultiDecrementBO;

/**
 * 秒杀缓存管理
 * @author LGH
 */
public interface SeckillCacheManager {

    /**
     * 创建订单路径
     * @param userId
     * @return
     */
    String createOrderPath(String userId);

    /**
     * 校验订单路径
     * @param userId
     * @param orderPath
     * @return
     */
    void checkOrderPath(String userId, String orderPath);

    /**
     * 减少秒杀sku库存
     * @param multiDecrementBO 订单库存数据
     */
    void decrSeckillSkuStocks(MultiDecrementBO multiDecrementBO);

    /**
     * 减少秒杀sku库存
     * @param mergerOrder 订单数据
     * @param maxNum 限购数量
     */
    void decrSeckillSkuStocks(ShopCartOrderMergerDto mergerOrder, Integer maxNum);

    /**
     * 获取秒杀sku库存
     *
     * @param seckillId 秒杀Id
     * @param skuId 秒杀商品skuId
     * @return
     */
    Integer getStockBySeckillSkuId(Long seckillId, Long skuId);

    /**
     * 刷新秒杀商品库存到数据库
     * @param seckillSkuId
     */
    void flushStockToDb(Long seckillSkuId);

    /**
     * 刷新并移除库存缓存
     * @param seckillId
     */
    void flushAndRemoveStockCache(Long seckillId);

    /**
     * 查询创建失败的订单，用于解锁库存
     */
    void unLockFailOrderStock();

    /**
     * 用户参与指定秒杀活动的次数
     * @param seckillId
     * @param userId
     * @return
     */
    Integer selectNumByUser(Long seckillId, String userId);
}
